using System;

namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement a Point3D class.
    /// </summary>
    public interface IPoint3D : IComparable
    {
        /// <summary>
        /// Gets or sets the x position.
        /// </summary>
        /// <value>The x position.</value>
        double X { get; set; }

        /// <summary>
        /// Gets or sets the y position.
        /// </summary>
        /// <value>The y position.</value>
        double Y { get; set; }

        /// <summary>
        /// Gets or sets the z position.
        /// </summary>
        /// <value>The z position.</value>
        double Z { get; set; }

        /// <summary>
        /// Adds a x, yValue and z value to the current point instance.
        /// </summary>
        /// <param name="xValue">The x value.</param>
        /// <param name="yValue">The y value.</param>
        /// <param name="zValue">The yValue value.</param>
        void Add(double xValue, double yValue, double zValue);

        /// <summary>
        /// Inverts the position elements x y and z.
        /// </summary>
        void InvertPositionElements();

        /// <summary>
        /// Copies this current instance of the point.
        /// </summary>
        /// <returns>A copy of the current instance.</returns>
        Point3D Copy();

        /// <summary>
        /// Scales the position elements x, y and z with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTransformation(double scaleFactor);

        /// <summary>
        /// Scales the position elements x, y and z with a specified factor.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        /// <param name="scaleFactorZ">The scale factor for the z position.</param>
        void ScaleTransformation(double scaleFactorX, double scaleFactorY, double scaleFactorZ);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValue">The translate value for the x-, y- and z position.</param>
        void TranslateTransformation(double translateValue);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValueX">The translate value for x position.</param>
        /// <param name="translateValueY">The translate value for y position.</param>
        /// <param name="translateValueZ">The translate value for z position.</param>
        void TranslateTransformation(double translateValueX, double translateValueY, double translateValueZ);

        /// <summary>
        /// Calculates the distance from the current instance of a point to another point.
        /// </summary>
        /// <param name="point">The other point.</param>
        /// <returns>The distance from the current instance of a point to another point</returns>
        double GetDistance(Point3D point);

        /// <summary>
        /// Determines whether the position elements are zero.
        /// </summary>
        /// <returns>
        /// 	<c>true</c> if the position elements are zero; otherwise, <c>false</c>.
        /// </returns>
        bool IsZero();

        /// <summary>
        /// Transforms the current point instance into a matrix.
        /// </summary>
        /// <returns>The transformed matrix.</returns>
        Matrix ToMatrix();

        /// <summary>
        /// Transforms the current point instance into a vector.
        /// </summary>
        /// <returns>The transformed vector.</returns>
        GeneralVector ToVector();
    }
}